package com.dx.chat.client;

import com.dx.chat.util.ByteUtil;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.nio.charset.StandardCharsets;

/**
 * Description: 连接线程
 *
 * @author rockstarsteve
 * @version 1.0
 * @copyright Copyright (c) 电信
 * @since 2023/9/8
 */
@Slf4j
public class ClientConnectionThead extends Thread {

    ClientInfoBean clientInfoBean = null;

    public ClientConnectionThead(ClientInfoBean clientInfoBean) {
        this.clientInfoBean = clientInfoBean;
    }

    @Override
    public void run() {
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        try {
            bufferedInputStream = new BufferedInputStream(clientInfoBean.getSocket().getInputStream());
            while (true) {
                byte[] readBytes = new byte[1024];
                int res = bufferedInputStream.read(readBytes);
                String ipAddr = clientInfoBean.getSocket().getInetAddress().getHostAddress();
                if (readBytes[4] == 0 && res > 5) {
                    String receive = new String(readBytes, 5, res - 5, StandardCharsets.UTF_8);
                    log.info("收到的消息内容是：{}", receive);
                    clientInfoBean.setChatInfoString(clientInfoBean.getChatInfoString() + "\t服务端(" + ipAddr + ")：" + receive + "\n");
                } else if (readBytes[4] == 1 && res > 9) {
                    /**
                     * 4位ip位 1位内容标识位 4位头部长度位 1位文件开始标识位 文件名称位  文件内容开始 （1位内容标识位：0：文本，1：文件；1位文件开始标识位:0：开始，1：中间部分）
                     * 4位ip位 1位内容标识位 4位头部长度位 1位文件开始标识位 文件名称位 文件内容中间
                     * 4位ip位 1位内容标识位 4位头部长度位 1位文件开始标识位 文件名称位 文件内容后面
                     */
                    log.info("处理文件");
                    //获取文件头长度
                    byte[] headLengthBytes = new byte[]{readBytes[5], readBytes[6], readBytes[7], readBytes[8]};
                    int headLength = ByteUtil.bytesToInt(headLengthBytes);
                    //获取文件名
                    int fileNameLength = headLength - 10;
                    byte[] fileNameBytes = new byte[fileNameLength];
                    for (int i = 0; i < fileNameLength; i++) {
                        fileNameBytes[i] = readBytes[i + 10];
                    }
                    String fileName = new String(fileNameBytes);
                    log.info("文件名称是：{}", fileName);
                    //获取文件是否是开始传输，如果是就清除文件内容
                    File fileDir = new File("file/");
                    if (readBytes[9] == 0) {
                        clientInfoBean.setChatInfoString(clientInfoBean.getChatInfoString() + "\t服务端(" + ipAddr + ")：正在发送\"" + fileName + "\"文件！\n");
                        //文件夹不存在就创建
                        if (!fileDir.exists()) {
                            fileDir.mkdir();
                        }
                        //清除文件
                        File file = new File(fileDir.getAbsolutePath() + File.separator + fileName);
                        if (file.exists()) {
                            file.delete();
                        }
                        file.createNewFile();
                    }
                    //获取文件长度
                    bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(fileDir.getAbsolutePath() + File.separator + fileName, true));
                    bufferedOutputStream.write(readBytes, headLength, res - headLength);
                    bufferedOutputStream.flush();
                    bufferedOutputStream.close();
                    // 说明是最后一次在传送文件，所以传送的字节数才会小于字节数组by的大小
                    if (res < 1024) {
                        String localIpAddr = InetAddress.getLocalHost().getHostAddress();
                        log.info("文件传输完成。。。");
                        clientInfoBean.setChatInfoString(clientInfoBean.getChatInfoString() + "客户端(" + localIpAddr + ")：接收\"" + fileName + "\"文件成功！\n");
                    }
                } else {
                    log.error("客户端端收到未知的内容。。。");
                }
            }
        } catch (Exception e) {
            log.error("处理服务端的数据错误！！：{}", e);
        } finally {
            clientInfoBean.setChatInfoString(clientInfoBean.getChatInfoString() + "*************提示:与服务器断开连接******************\n");
            try {
                log.info("开始关闭客户端的各种连接。。。。。");
                clientInfoBean.setSocket(null);
                if (bufferedOutputStream != null) {
                    bufferedOutputStream.close();
                }
                if (bufferedInputStream != null) {
                    bufferedInputStream.close();
                }
            } catch (IOException e) {
                log.error("关闭流错误！！：{}", e);
            }
        }
    }

}
